#include "Output.h";

//geeft de pointer naar de output terug
mailBox *GiveOutputOut(output *out)
{
	return &(*out).Uitvoer;
}

//initialiseert de output
void outputInit(output *out)
{
	(*out).taak = (task*)malloc(sizeof(task)); //maakt plaats voor de taak
	create_mailBox(&((*out).Todo), 1, sizeof(outputInvoer)); //maakt een mailbox waarin data kan worden gezet
	create_mailBox(&((*out).Uitvoer), 1, sizeof(outputUitvoer));
	create_event((&(*out).dataOpOut), 0); //maakt het event van output
}

//de taak die actief de output verzorgt.
unsigned __stdcall outputStart(void* arg){
	task* t = (task*) arg; //haal de taak op
	outputInvoer invoer; //maak een variabele die de invoer tijdelijk kan verwerken
	outputUitvoer uitvoer;
	int outp = 0; //maar een tijdelijke integer variabele die gebruikt kan worden bij het rekenen
	output *out = (output *)getArgument_task(t); //haal de pointer naar de output op
	while(!isTerminated_task(t)){
		//wacht op input
		get_mailBox(&((*out).Todo), &invoer); //haal data op uit de mailbox en zet deze in invoer
		
		//maak de output gereed om te versturen naar buiten
		outp = (invoer.huidigeSnelheid-invoer.ingesteldeSnelheid)*(-1); //voer het rekensommetje uit om te kijken naar wat er moet gebeuren
		uitvoer.bijstellingSnelheid = outp;
		uitvoer.stat = invoer.stat;

		//stuurt signalen naar buiten
		put_mailBox(&((*out).Uitvoer), &uitvoer); //zet de correctie op de mailbox
		pulse_event(&((*out).dataOpOut)); //pulse het event wat zegt dat er data klaar is
	}
	return 0;
}

//ruimt de ourput op
void outputDelete(output *out)
{
	delete((*out).taak);			//verwijdert de taak
	delete_mailBox(&((*out).Todo));		//verwijdert de mailbox
	delete_mailBox(&((*out).Uitvoer));	//verwijdert de mailbox
	delete_event(&((*out).dataOpOut));	//verwijdert het event
}